

package modelos;

import java.lang.String;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;


public class MProducto extends MDB{

    private int cod_categoria;
    private String descripcion;
    private float precio;
    
    public MProducto(){
            super();
    }

    public boolean registar(){
        abrir();
        boolean sw = false;
        String sql="INSERT INTO Producto (codigo, cod_categoria, descripcion, precio , estatus ) VALUES(?,?,?,?,?)";
        PreparedStatement stam = crearPreparedStatement(sql);
        try {
            stam.setInt(1, getCodigo());
            stam.setInt(2, getCodigo_categoria());
            stam.setString(3, getDescripcion().toLowerCase());
            stam.setFloat(4, getPrecio());
            stam.setString(5, getEstatus());
            stam.executeUpdate();
            sw = true;
        } catch (SQLException ex) {
            Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
        }
        cerrar();
        return sw;
    }
    

    public void registarIngredientes(Vector<Integer> codigos,Vector<Float> raciones){
        abrir();
        for (int i = 0; i < raciones.size(); i++){
            String sql="INSERT INTO ingrprod (cod_producto,cod_ingrediente, porcion , estatus ) VALUES(?,?,?,'A')";
            PreparedStatement stam = crearPreparedStatement(sql);
            try {
                stam.setInt(1, getCodigo());
                stam.setInt(2,codigos.elementAt(i));
                stam.setFloat(3, raciones.elementAt(i));
                stam.executeUpdate();
            } catch (SQLException ex) {
                Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
            }
        }        
        cerrar();
    }

    public void eliminarIngredientes(Vector<Integer> codigos){
        abrir();
        for (int i = 0; i < codigos.size(); i++){
            String sql="UPDATE ingrprod SET estatus = 'A' WHERE cod_producto=? AND cod_ingrediente=?";
            PreparedStatement stam = crearPreparedStatement(sql);
            try {
                stam.setInt(1, getCodigo());
                stam.setInt(2,codigos.elementAt(i));
                stam.executeUpdate();
            } catch (SQLException ex) {
                Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        cerrar();
    }

 public boolean eliminar(){
     return eliminar("Producto");
 }

  public boolean actualizar(){
     abrir();
     boolean sw = false;
     String sql="UPDATE Producto SET precio=?  WHERE codigo=?  AND estatus = 'A'";
     PreparedStatement stam = crearPreparedStatement(sql);
     try {
         stam.setFloat(1, getPrecio());
         stam.setInt(2, getCodigo());
         stam.executeUpdate();
         sw = true;
     } catch (SQLException ex) {
            Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
     }
     cerrar();
     return sw;
 }

  public boolean  consultar(){
    boolean sw = false;
    abrir();
    String sql="SELECT * FROM Producto WHERE codigo=? AND estatus='A'";
    PreparedStatement stam = crearPreparedStatement(sql);
     try {
         stam.setInt(1, getCodigo());
         rs = stam.executeQuery();
         if (rs.next()){
            setDescripcion(rs.getString("descripcion"));
            setCodigo(rs.getInt("codigo"));
            setPrecio(rs.getFloat("precio"));
            setEstatus(rs.getString("estatus"));
            setCod_categoria(rs.getInt("cod_categoria"));
            sw = true;
         }
    } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return sw;
  }

  public Vector<MProducto> listarProductos(){
    Vector<MProducto> v = new Vector<MProducto>();
    String sql="SELECT * FROM Producto WHERE estatus='A'";
    abrir();
    try {
        rs = crearStatement().executeQuery(sql);
        while (rs.next()){
            MProducto  i = new MProducto();
            i.setDescripcion(rs.getString("descripcion"));
            i.setCodigo(rs.getInt("codigo"));
            i.setPrecio(rs.getFloat("precio"));
            i.setEstatus(rs.getString("estatus"));
            i.setCod_categoria(rs.getInt("cod_categoria"));
            v.add(i);
         }
    } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  public Vector<String []> listarIngredientesMasUsados(boolean ascesdente,boolean descesdente){
    Vector<String []> v = new Vector<String []>();
    String sql="SELECT porciones , descripcion , codigo FROM  Ingrediente,(SELECT SUM(porcion) AS porciones,cod_ingrediente AS cod FROM IngrProd WHERE estatus='A' GROUP BY cod_ingrediente) Suma WHERE Ingrediente.codigo=Suma.cod ORDER BY porciones ";
    if(ascesdente)
        sql+= "ASC";
    if(descesdente)
        sql+= "DESC";
    abrir();
    try {
        rs = crearStatement().executeQuery(sql);   
        while (rs.next()){
            String [] s = new String [] {rs.getString("descripcion"), ""+rs.getFloat("porciones"), ""+rs.getInt("id")};
            v.add(s);
        }
  } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  public Vector<String []> listarIngredientes(){
    Vector<String []> v = new Vector<String []>();
    abrir();
    String sql="SELECT Ingrediente.descripcion, IngrProd.porcion  FROM Ingrediente, Producto,IngrProd where Ingrediente.estatus='A' AND IngrProd.estatus='A' AND Producto.estatus='A' AND Producto.codigo=IngrProd.cod_producto AND Ingrediente.codigo=IngrProd.cod_ingrediente Producto.codigo=?";
    PreparedStatement stam = crearPreparedStatement(sql);
    try {
        stam.setInt(1, getCodigo());
        rs= stam.executeQuery();
        while (rs.next()){
            String [] s = new String [] {rs.getString(1), ""+rs.getFloat(2)};
            v.add(s);
        }
    } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  public String buscarCategoria(){
    String sql="SELECT Categoria.descripcion FROM Categoria,Producto WHERE Producto.estatus='A' AND Producto.cod_categoria=Categoria.id AND Producto.codigo=?";
    abrir();
    PreparedStatement stam = crearPreparedStatement(sql);
    try{
        stam.setInt(1, getCodigo());
        rs =stam.executeQuery();
        if (rs.next())
            return rs.getString(1);
    } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
  }

  
  public Vector<String []> listarVentas(boolean ascesdente,boolean descesdente){
    Vector<String []> v = new Vector<String []>();
    String sql="SELECT descripcion, (precio*total.cantidad), total.cantidad, codigo FROM  Producto, (SELECT sum(prodorde.cantidad) as cantidad, prodorde.cod_producto AS cod_total FROM prodorde where estatus='A' GROUP BY prodorde.cod_producto) total WHERE total.cod_total=codigo AND estatus='A' ORDER BY(total.cantidad,(precio*total.cantidad))";
    if(ascesdente)
        sql+= "ASC";
    if(descesdente)
        sql+= "DESC";
    abrir();   
    try{
        rs= crearStatement().executeQuery(sql);
        while (rs.next()){
            String [] s = new String [] {rs.getString(1), ""+rs.getFloat(2), ""+rs.getInt(3), ""+rs.getInt(4)};
            v.add(s);
        }
    } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

   public boolean disponibilidadIngredientes(String descripcion){
    Vector<MIngrediente> v = new Vector<MIngrediente>();
    Vector<Float> f = new Vector<Float>();
    String sql="SELECT Ingrediente.codigo,IngrProd.porcion FROM  Ingrediente,IngrProd,Producto WHERE Ingrediente.estatus='A' AND IngrProd.estatus='A' AND Producto.estatus='A' AND Ingrediente.codigo=IngrProd.cod_ingrediente AND Producto.codigo=IngrProd.cod_producto AND Producto.codigo=?";
    abrir();
    PreparedStatement stam = crearPreparedStatement(sql);
    try{
        stam.setInt(1, getCodigo());
        rs =stam.executeQuery();
        while(rs.next()){
            MIngrediente  i = new MIngrediente();
            i.setCodigo(rs.getInt(1));
            f.add(rs.getFloat(2));
            v.add(i);
         }
     } catch (SQLException ex) {
            Logger.getLogger(MIngrediente.class.getName()).log(Level.SEVERE, null, ex);
     }
     cerrar();
     for (int i = 0; i < v.size(); i++)
         if(!(v.elementAt(i).disponibilidad(f.elementAt(i)))){
          return false;
         }
     return true;
  }

 public void actualizarStockIngredientes(){
    Vector<MIngrediente> v = new Vector<MIngrediente>();
    Vector<Float> f = new Vector<Float>();
    String sql="SELECT Ingrediente.codigo,IngrProd.porcion FROM  Ingrediente,IngrProd,Producto WHERE Ingrediente.estatus='A' AND IngrProd.estatus='A' AND Producto.estatus='A' AND Ingrediente.codigo=IngrProd.cod_ingrediente AND Producto.codigo=IngrProd.cod_producto AND Producto.codigo=?";
    abrir();
    PreparedStatement stam = crearPreparedStatement(sql);
    try{
        stam.setInt(1, getCodigo());
        rs =stam.executeQuery();
        while(rs.next()){
            MIngrediente  i = new MIngrediente();
            i.setCodigo(rs.getInt(1));
            f.add(rs.getFloat(2));
            v.add(i);
         }
     } catch (SQLException ex) {
            Logger.getLogger(MIngrediente.class.getName()).log(Level.SEVERE, null, ex);
     }
     cerrar();
     for (int i = 0; i < v.size(); i++){
         v.elementAt(i).consultar();
         v.elementAt(i).setStock(v.elementAt(i).getStock()-f.elementAt(i));
         v.elementAt(i).actualizar();
     }
  }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }
    public int getCodigo_categoria() {
        return cod_categoria;
    }

    public void setCod_categoria(int cod_categoria) {
        this.cod_categoria = cod_categoria;
    }

    public float getPrecio() {
        return precio;
    }

    public void setPrecio(float precio) {
        this.precio = precio;
    }



}
